Terraform でサービスアカウントを管理下へ移す
サービスアカウント
コンソールでぽちぽち作ったものを管理下に移してみる
localhost@{projectId}.iam.gserviceaccount.com というローカル開発用のアカウント
import する
code:import
resource "google_service_account" "localhost_account" {
account_id = "localhost"
}
$ terraform import google_service_account.localhost_account projects/{projectId}/serviceAccounts/localhost@{projectId}.iam.gserviceaccount.com
plan して .tf へ書き戻す
description, display_name を設定する
plan して diff が出ないのを確認
ロール
role を管理下に移したい
google_project_iam_member を使う(他にもあるがハマる 話があるのでこれを使う) ちょっとややこしいのが google_project_iam_member は1つの role しか指定できない(gcloud コマンドでも複数指定できるつもりでいてハマったことがある)
つまりサービスアカウントとロールのリレーションごとに1つ Terraform 上で resource を定義する感じになる
デフォルトで用意されてるやつは感知しないで、AppEngine default service account に role 追加だけやる、とかはまあやりやすいかな、元のやつを管理下に置くために面倒なことしなくていいし
実際に書き戻す必要あるかは謎、すでに定義済みのやつを apply しても問題ないように思えるし、普通に書いて適用してもいい気がする
ちょっと面倒なのでこれを参考にする
これを書いて
code:roles
resource "google_project_iam_member" "localhost_iam_member" {
member = "serviceAccount:${google_service_account.localhost_account.email}"
count = length(var.localhost_roles)
role = element(var.localhost_roles, count.index)
}
variable "localhost_roles" {
type = list(string)
default = [
"roles/editor",
"roles/secretmanager.secretAccessor",
]
}
import
$ terraform import "google_project_iam_member.localhost_iam_member0" "{projectId} roles/editor serviceAccount:localhost@{projectId}.iam.gserviceaccount.com" $ terraform import "google_project_iam_member.localhost_iam_member1" "{projectId} roles/secretmanager.secretAccessor serviceAccount:localhost@{projectId}.iam.gserviceaccount.com" 配列のリソースは [index] をつけるものらしい
これで terraform plan して差分出ないのを確認する
Cloud Resource Manager API が有効になってないとのことなので有効にする必要がある(エラーメッセージのリンクから)
ちょっと気になるのは role のリストを差し込んだときのオペレーション
[role/A, role/B, role/C] から role/B を削除したときにどうなるのか?
[1] に差分 role/B → role/C
[2] が削除 role/C
になるので、なんか困ったことにならないかはよく分かってない
開発環境用の role 定義だから一時的におかしくなってもまあいいかと思ってこれで管理してるけど、プロダクションで使ってるやつは多少面倒でも個別に指定するかなあ
カスタムロールを作るほうが簡単かもしれない
カスタムロールを作って割り当てる
権限の調整はカスタムロールを更新する
こっちは permission のリストアップが必要でめんどいんだが...(role は permission のまとまり)
カスタムロールは削除しても7日残ったり元の名前使えるようになるまで30日かかったりするので、なんか rename したり同名のリソース作ったりすると面倒に巻き込まれそうでやってない
一部の permission はカスタムロール対応してなかったりしてムカつくし
index がずれる問題、こういう話題がある
set & for_each でやる
code:set.tf
# ローカル開発用サービスアカウント
resource "google_service_account" "localhost_account" {
account_id = "localhost"
display_name = "localhost"
description = "ローカル開発用"
}
resource "google_project_iam_member" "localhost_iam_member" {
member = "serviceAccount:${google_service_account.localhost_account.email}"
for_each = var.localhost_roles
role = each.value
}
variable "localhost_roles" {
type = set(string)
default = [
"roles/editor",
"roles/secretmanager.secretAccessor",
]
}